package com.hyyt.shopjsp.basic.service.imp;

import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import com.hyyt.shopjsp.basic.pojo.*;
import com.hyyt.shopjsp.basic.vo.BasicAreaVo;
import com.hyyt.shopjsp.util.common.ResultMsg;
import com.hyyt.shopjsp.util.common.Utils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import com.hyyt.shopjsp.basic.dao.BasicAreaDAO;
import com.hyyt.shopjsp.basic.service.IBasicAreaService;
/**
 * Copyright (c) 2017 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
 * @Description basic_area, BASIC_地区表
 * @author Zhang Dingfang
 * @CreateTime 2017-3-20 10:05:18
 */
@Service
public class BasicAreaService implements IBasicAreaService {
    private static  final Logger logger = Logger.getLogger(IBasicAreaService.class);

    @Resource
    private BasicAreaDAO basicAreaDAO;

    /**
     * 保存BASIC_地区表
     *
     * @param basicArea BASIC_地区表
     * @return 保存后的BASIC_地区表
     */
    @Override
    public ResultMsg saveOrUpdateBasicArea(BasicArea basicArea) {
        if(Utils.objectIsNotEmpty(basicArea)) {
            if (Utils.objectIsNotEmpty(basicArea.getAreaId())) {
                basicArea.setModifyDate(new Timestamp(System.currentTimeMillis()));//设置修改时间
                basicAreaDAO.update(basicArea);
            } else {
                BasicArea parentArea = basicAreaDAO.load(basicArea.getParentId());
                if(Utils.objectIsNotEmpty(parentArea)){//父节点不为空
                    if (parentArea.getIsLeaf().compareTo(0) != 0) {//修改父节点为非子节点
                        parentArea.setIsLeaf(0);
                        basicAreaDAO.update(parentArea);
                    }
                    String fullName=parentArea.getFullName()+basicArea.getName();
                    basicArea.setFullName(fullName);
                    basicArea.setLevelCode(parentArea.getLevelCode() + 1);
                }else{//父节点为空，当前节点为一级节点
                    basicArea.setParentId(0);
                    basicArea.setFullName(basicArea.getName());
                    basicArea.setLevelCode(1);
                }
                basicArea.setIsLeaf(1);  //肯定是叶子节点
                basicArea.setCreateDate(new Timestamp(System.currentTimeMillis()));//设置创建时间
                basicArea.setModifyDate(new Timestamp(System.currentTimeMillis()));//默认和创建时间一样
                basicAreaDAO.insert(basicArea);    //保存此地区对象
            }
            return new ResultMsg(true);
        }else{
            return new ResultMsg(false);
        }
    }


    /**
     * 更新BASIC_地区表
     *
     * @param basicArea BASIC_地区表
     * @return 更新后的BASIC_地区表
     */
    @Override
    public void updateBasicArea(BasicArea basicArea) {
        basicAreaDAO.update(basicArea);
    }

    /**
     * 删除指定ID的地区对象
     *
     * @param areaId
     */
    @Override
    public ResultMsg deleteBasicAreaById(Integer areaId) {
        ResultMsg result = new ResultMsg(false);
        if (Utils.objectIsNotEmpty(areaId)) {
            //获取当前地区对象
            BasicArea area = basicAreaDAO.load(areaId);
            if (Utils.objectIsNotEmpty(area)) {
                basicAreaDAO.delete(areaId); //删除当前地区
                Map<String, Object> param = new HashMap<>();
                param.put("parentId", area.getParentId());
                int count = this.countBasicArea(param);
                //判断此地区是否有兄弟，等于1 即没有兄弟，那么父节点地区即成为叶子节点
                if (count == 0) {
                    BasicArea parentArea = basicAreaDAO.load(area.getParentId());
                    parentArea.setIsLeaf(1);  //改为叶子节点
                    basicAreaDAO.update(parentArea);
                }
                result.setSuccess(true);
            } else {
                result.setMsg("您操作的地区已不存在");
            }
        } else {
            result.setMsg("无法获得地区id，请重新操作");
        }
        return result;
    }


    /**
     * 根据ID加载一个BASIC_地区表
     *
     * @param areaId BASIC_地区表ID
     * @return BASIC_地区表
     */
    @Override
    public BasicArea loadBasicArea(Integer areaId) {
        return basicAreaDAO.load(areaId);
    }


    /**
    * 查询所有的BASIC_地区表，通常有最多取30000条记录的限制
    *
    * @return 所有的BASIC_地区表，通常有最多取30000条记录的限制
    */
    @Override
    public List<BasicArea> queryAllBasicArea(Map<String, Object> params) {
        return basicAreaDAO.query("getNodes",params);
    }

    /**
     * 查询BASIC_地区表
     *
     * @param params 查询参数，为key-value形式
     * @return BASIC_地区表集合
     */
    @Override
    public List<BasicArea> queryBasicArea(Map<String, Object> params) {
        return basicAreaDAO.query(params);
    }

    /**
     * 查询BASIC_地区表
     *
     * @param params   查询参数，没有则传null,分页参数key为“sortColumns”
     * @param startRow 起始行数（不含起始行的数据）
     * @param rowSize  要查询记录数
     * @return BASIC_地区表集合
     */
    @Override
    public List<BasicArea> queryBasicArea(Map<String, Object> params, int startRow, int rowSize) {
        return basicAreaDAO.query(params, startRow, rowSize);
    }

    /**
     * 统计BASIC_地区表
     *
     * @param params 查询参数，没有则传null,分页参数key为“sortColumns”
     * @return 结果集记录数
     */
    @Override
    public int countBasicArea(Map<String, Object> params) {
        return basicAreaDAO.count(params);
    }

    /**
     * 根据父id查询BASIC_地区表
     * @param param
     * @return
     */
	@Override
	public List<BasicArea> queryParentBasicArea(Map<String, Object> param) {
		return basicAreaDAO.query(param);
	}

    /**
     * 区域订单统计列表
     * @param params
     * @param startRow
     * @param rowSize
     * @return
     */
    @Override
    public List<BasicAreaVo> queryAreaOrdersCount(Map<String, Object> params, int startRow, int rowSize) {
        return basicAreaDAO.query("queryAreaOrdersCount",params, startRow, rowSize);
    }

    /**
     * 导出区域订单统计
     * @param params
     * @return
     */
    @Override
    public List<BasicAreaVo> queryAreaOrdersCount(Map<String, Object> params) {
        return basicAreaDAO.query("queryAreaOrdersCount",params);
    }
    /**
     * 区域订单统计数量
     * @param params
     * @return
     */
    @Override
    public int countAreaOrdersCount(Map<String, Object> params) {
        return basicAreaDAO.count("countAreaOrdersCount",params);
    }

}